#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
@Project ：python_learning 
@File ：工厂模式.py
@IDE  ：PyCharm 
@Author ：李涵彬
@Date ：2024/3/1 17:53 
"""

"""
工厂方法模式 (Factory Method Pattern)
工厂方法模式是一种创建型设计模式，用于创建对象而无需指定具体类。它定义了一个创建对象的接口，但让子类决定实例化哪个类。这样，工厂方法模式允许类将实例化延迟到子类中。

在 Python 中，我们可以使用函数或者类来实现工厂方法模式。下面是一个使用类实现的简单示例：

在这个示例中，我们定义了一个产品接口 Product，以及两个具体产品类 ConcreteProductA 和 ConcreteProductB。然后定义了创建者接口 Creator，以及两个具体创建者类 ConcreteCreatorA 和 ConcreteCreatorB。每个具体创建者类都实现了工厂方法 factory_method 来创建相应的产品。

在客户端代码中，我们可以根据需要选择具体的创建者类来创建产品，并执行相应的操作。这样做使得客户端代码与具体产品类解耦合，从而更容易进行扩展
"""

from abc import ABC, abstractmethod


# 定义产品接口
class Product(ABC):
	@abstractmethod
	def operation(self):
		pass


# 具体产品A
class ConcreteProductA(Product):
	def operation(self):
		return "具体产品A的操作"


# 具体产品B
class ConcreteProductB(Product):
	def operation(self):
		return "具体产品B的操作"


# 定义创建者接口
class Creator(ABC):
	@abstractmethod
	def factory_method(self):
		pass

	def some_operation(self):
		product = self.factory_method()
		result = f"Creator执行操作，{product.operation()}"
		return result


# 具体创建者A
class ConcreteCreatorA(Creator):
	def factory_method(self):
		return ConcreteProductA()


# 具体创建者B
class ConcreteCreatorB(Creator):
	def factory_method(self):
		return ConcreteProductB()


# 客户端代码
def client_code(creator: Creator):
	print(creator.some_operation())


if __name__ == "__main__":
	# 使用具体创建者A
	client_code(ConcreteCreatorA())  # 输出：Creator执行操作，具体产品A的操作

	# 使用具体创建者B
	client_code(ConcreteCreatorB())  # 输出：Creator执行操作，具体产品B的操作
